package pe.com.drokasa.rest.webservice;

import java.util.ArrayList;
import java.util.List;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import pe.com.drokasa.mirror.datagram.helper.DatagramHelper;
import pe.com.drokasa.mirror.datagram.request.Transaction017Request;
import pe.com.drokasa.mirror.datagram.response.Transaction017Response;
import pe.com.drokasa.mirror.datagram.response.model.ResponseBean017;
import pe.com.drokasa.rest.webservice.conexion.ConexionCliente;
import pe.com.drokasa.rest.webservice.config.ServiceConfig;
import pe.com.drokasa.rest.webservice.model.Sucursal;

import com.google.gson.Gson;

/**
 * @author Synopsis S.A
 *
 */
public class DrokasaService 
{	
	private ConnectionFactory factory;
	private Queue sendQueue;
	private Queue receiveQueue;
	
	private ServiceConfig config;
	
	private Gson gson = new Gson();
	
	/**
	 * @param config
	 */
	public DrokasaService(ServiceConfig config)
	{
		this.config = config;
	}
	
	@GET
	@Path("/stockPorProducto/{codigoVendedor}/{codigoProducto}")
	@Produces("application/json")
	public String obtenerStockProducto(@PathParam("codigoVendedor") String codigoVendedor, @PathParam("codigoProducto") String codigoProducto)
	{
		Transaction017Request request = DatagramHelper.getTransaction017Request(config.getProperty("aplicacion"), config.getProperty("transaccion.017"), 
											config.getProperty("tipodispositivo"), config.getProperty("usuario"), 
											config.getProperty("password"), codigoVendedor, codigoProducto);
		
		String res = send(request.build());
		Transaction017Response response = DatagramHelper.getTransaction017Response(res);
		
		List<Sucursal> stockSucursales = new ArrayList<Sucursal>();
		
		if(response.getIndicadorStatus().equals("0"))
		{
			List<ResponseBean017> resultados = response.getData();
			
			for (ResponseBean017 bean : resultados) 
			{
				Sucursal sucursal = new Sucursal();
				sucursal.setCodigo(bean.getCodigoSucursal());
				sucursal.setNombre(bean.getNombreSucursal());
				sucursal.setSigno(bean.getSigno());
				sucursal.setStock(Integer.parseInt(bean.getStockMercaderia()));
				stockSucursales.add(sucursal);
			}		
		}
		
		return gson.toJson(stockSucursales);
	}
	
	/**
	 * Env&iacute;a el mensaje hacia el servicio.
	 * 
	 * @param messageToSend
	 * @return
	 */
	private String send(String messageToSend)
	{
		String response = "";
		try 
		{
			response = sendByMQ(messageToSend);
		} 
		catch (JMSException e) 
		{
			e.printStackTrace();
			return sendBySocket(messageToSend);
		}
		return response;
	}
	
	/**
	 * Env&iacute;a el mensaje utilizando MQ.
	 * 
	 * @param messageToSend
	 * @return
	 */
	private String sendByMQ(String messageToSend) throws JMSException
	{
		// Se envia el mensaje a la cola correspondiente
		Connection connection = factory.createConnection();
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		MessageProducer messageProducer = session.createProducer(sendQueue);
		TextMessage message = session.createTextMessage(messageToSend);
		messageProducer.send(message);
		
		// Se recibe el mensaje buscando en la cola de respuesta
		MessageConsumer consumer = session.createConsumer(receiveQueue);
		TextMessage response = (TextMessage) consumer.receive();
		return response.getText();
	}
	
	/**
	 * Env&iacute;a el mensaje utilizando Sockets.
	 * 
	 * @param messageToSend
	 * @return
	 */
	private String sendBySocket(String messageToSend)
	{
		return ConexionCliente.ejecutarOperacion(messageToSend);
	}
	
	/**
	 * @param factory the factory to set
	 */
	public void setFactory(ConnectionFactory factory) 
	{
		this.factory = factory;
	}

	/**
	 * @param sendQueue the queueSend to set
	 */
	public void setSendQueue(Queue sendQueue) 
	{
		this.sendQueue = sendQueue;
	}

	/**
	 * @param receiveQueue the queueReceive to set
	 */
	public void setReceiveQueue(Queue receiveQueue) 
	{
		this.receiveQueue = receiveQueue;
	}
}